	/**
	 * 返回行结果
	 * 按照 JDBC 数据类型 到 JavaScript 类型的转换。
	 * @private
	 * @param {ResultSet}
	 * @return {Array}
	 */
	function getValue(rsObj){
		var result = [];
		var ResultSetMetaData = rsObj.getMetaData();
		var Types = java.sql.Types;

		while(rsObj.next()){
			var row = {};
			for(var i = 0, j = ResultSetMetaData.getColumnCount(); i < j; i++) {
				var colIndex = i + 1; // 列数从 1 开始
				
				var columnName = ResultSetMetaData.getColumnLabel(colIndex), 
//					columnName = columnName.toLowerCase(),
					value;
				//println('::::::::::'+ResultSetMetaData.getColumnName(colIndex));
				//println('::::::::::000'+rsObj.getString('newscatalog'));
//				if(columnName=='content')println( String(rsObj.getString(colIndex)));
				// http://www.cnblogs.com/myCodingSky/p/3637513.html

				switch(ResultSetMetaData.getColumnType(colIndex)){
					case Types.BIT:
					case Types.SMALLINT:
						value = Boolean(rsObj.getBoolean(colIndex));
					break;
					case Types.LONGVARBINARY:// what the hell?
					case Types.CHAR:
					case Types.VARCHAR:
					case Types.LONGVARCHAR:
						value = String(rsObj.getString(colIndex));
					break;
					case Types.NUMERIC:
					case Types.DECIMAL:
					case Types.TINYINT:
					case Types.SMALLINT:
					case Types.INTEGER:
					case Types.BIGINT:
					case Types.REAL:
					case Types.FLOAT:
					case Types.DOUBLE:
						value= Number(rsObj.getDouble(colIndex));
					break;
					// DATE 	java.sql.Date
					// TIME 	java.sql.Time
					// TIMESTAMP 	java.sql.Timestamp			
					case Types.DATE:
					case Types.TIME:
					case Types.TIMESTAMP:
//						var date = rsObj.getDate(colIndex);
//						println(rsObj.getString(colIndex))
//						value = new Date(rsObj.getString(colIndex));
						value = rsObj.getString(colIndex);
					break;
				}
				
				if(value){
					if(typeof value == 'number'){
					}else{
						// string?
						value = unescape(value); // 转义
					}
				}// null
				
				row[columnName] = value;
				
				value = null; // 有时会重复 value的值不知何解
			}
			result.push(row);
		}
		
		return result;
	}
	
	function getValue2JSON(rsObj){
		return JSON.stringify(getValue(rsObj));
	}
	function list_output(total, jsonArr){
		if(arguments.length == 1){
			// 单个 pojo 对象
			return total ? JSON.stringify(total[0]) : JSON.stringify({result:null});
		}else return JSON.stringify({
			total  : total,
			result : jsonArr
		});
	}
	
	function formatter(pojo, json_arr){
		if(!json_arr)return; // 没有记录集合
		var fns = [];
		// 收集所有 formatter
		for(var i in pojo){
			var field = pojo[i];
			if(field && field.formatter){
				var fn = field.formatter(); fn = String(fn);
				fn = new Function('item', 'arr', fn);
				fns.push(fn);
			}
		}
		var q = fns.length;
		if(!q)return; // 没有 formatter 无须处理
		
		// 遍历记录集合
		if(json_arr.length){ // list 的
			for(var i = 0, j = json_arr.length; i < j; i ++){
				for(var p = 0; p < q; p ++)fns[p](json_arr[i], json_arr);
			}
		}else{ // 单个实体
			for(var p = 0; p < q; p ++)fns[p](json_arr);
		}	
	}
	
	// 充血
	function setValue(pojo, arr){
		var hash = arr[0];
		for(var i in hash){
			if(pojo[i]){
				pojo[i].value = hash[i];
			}
		}
	}